www.gusucode.com > LTE基带收发仿真系统matlab源码程序 > LTE baseband simulation/precoding.m
function precodedSymb = precoding(layerSymb,preProcess,transMod,nTx,PMI,M_0_SYMB) % 预编码 完成复值符号到天线端口的映射过程 % 包含单天线预编码 传输分集和空间复用预编码 % 输入:layerSymb:层上符号 % preProcess:预处理方式 % transMod:传输模式 % nTx:发端天线数 % PMI:预编码码本序号 % M_0_SYMB:码字0上的复值符号数 % 输出: % precodedSymb:经过预编码的符号 % Author: 程式小组(徐萌 张妙 张晓庆) % Date: 2010-07-11 % ========================================================== load CodeBook %载入预编码码本 W_SM_2Tx(2天线码本)和W_SM_4Tx(4天线码本) if strcmp(preProcess,'singleAnt') precodedSymb = layerSymb; elseif strcmp(preProcess,'spatialMultiplexing') if transMod == 3 % 大时延CDD [nLayer,len] = size(layerSymb); precodedSymb = zeros(nTx,len); if nTx == 2 PMI = 1+(nLayer-1)*2^nTx; % 使用固定预编码 W = W_SM_2Tx(:,1:nLayer,PMI); U = 1/sqrt(2)*[1 1;1 exp(-1i*2*pi/2)]; for iSymb = 1:len D = [1 0;0 exp(-1i*2*pi*iSymb/2)]; precodedSymb(:,iSymb) = W*D*U*layerSymb(:,iSymb); end elseif nTx == 4 PMIgroup = [13 14 15 16]+(nLayer-1)*2^nTx; % 使用16个预编码码字中指定4个 if nLayer == 2 U = 1/sqrt(2)*[1 1;1 exp(-1i*2*pi/2)]; elseif nLayer == 3 U = 1/sqrt(3)*[1 1 1; 1 exp(-1i*2*pi/3) exp(-1i*4*pi/3); 1 exp(-1i*4*pi/3) exp(-1i*8*pi/3)]; elseif nLayer == 4 U = 1/sqrt(4)*[1 1 1 1; 1 exp(-1i*2*pi/4) exp(-1i*4*pi/4) exp(-1i*6*pi/4); 1 exp(-1i*4*pi/4) exp(-1i*8*pi/4) exp(-1i*12*pi/4); 1 exp(-1i*6*pi/4) exp(-1i*12*pi/4) exp(-1i*18*pi/4)]; end for iSymb = 1:len k = mod((iSymb-1)/nLayer,4)+1; W = W_SM_4Tx(:,1:nLayer,PMIgroup(k)); if nLayer == 2 D = [1 0;0 exp(-1i*2*pi*iSymb/2)]; elseif nLayer == 3 D = [1 0 0; 0 exp(-1i*2*pi*iSymb/3) 0; 0 0 exp(-1i*4*pi*iSymb/3)]; elseif nLayer == 4 D = [1 0 0 0; 0 exp(-1i*2*pi*iSymb/4) 0 0; 0 0 exp(-1i*4*pi*iSymb/4) 0; 0 0 0 exp(-1i*6*pi*iSymb/4)]; end precodedSymb = W*D*U*layerSymb(:,iSymb); end end % end if 天线选择 else nLayer = size(layerSymb,1); if nTx == 2 % 2天线端口配置,空间复用的码本大小:2*2*8 W_SM_2Tx % 4天线端口配置,空间复用的码本大小:4*4*64 W_SM_4Tx % 码本使用举例 W_SM_4Tx(:,1:3,33) 第一维表示天线数 第二维表示层数 第三维表示属于层3的第2个码字 PMI = PMI+1+(nLayer-1)*2^nTx; W = W_SM_2Tx(:,1:nLayer,PMI); precodedSymb = W*layerSymb; elseif nTx == 4 % 2天线端口配置,空间复用的码本大小:2*2*8 W_SM_2Tx % 4天线端口配置,空间复用的码本大小:4*4*64 W_SM_4Tx % 码本使用举例 W_SM_4Tx(:,1:3,33) 第一维表示天线数 第二维表示层数 第三维表示属于层3的第2个码字 PMI = PMI+1+(nLayer-1)*2^nTx; W = W_SM_4Tx(:,1:nLayer,PMI); precodedSymb = W*layerSymb; end % end if 天线选择 end % end if 大时延CDD和零时延选择 elseif strcmp(preProcess,'tranmitDiversity') if nTx == 2 W_TD_2Tx = 1/sqrt(2)*[1 0 1i 0;0 -1 0 1i;0 1 0 1i;1 0 -1i 0]; len = length(layerSymb); % 每层符号数 precodedSymb = zeros(2,len*2); % 存储经过预编码的符号 transSymb = [real(layerSymb(1,:));real(layerSymb(2,:));imag(layerSymb(1,:));imag(layerSymb(2,:))]; transPort = W_TD_2Tx*transSymb; precodedSymb(1,1:2:end-1) = transPort(1,:); precodedSymb(1,2:2:end-0) = transPort(3,:); precodedSymb(2,1:2:end-1) = transPort(2,:); precodedSymb(2,2:2:end-0) = transPort(4,:); elseif nTx == 4 W_TD_4Tx=1/sqrt(2)*[1 0 0 0 1i 0 0 0;0 0 0 0 0 0 0 0;0 -1 0 0 0 1i 0 0;0 0 0 0 0 0 0 0; 0 1 0 0 0 1i 0 0;0 0 0 0 0 0 0 0;1 0 0 0 -1i 0 0 0;0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0;0 0 1 0 0 0 1i 0;0 0 0 0 0 0 0 0;0 0 0 -1 0 0 0 1i; 0 0 0 0 0 0 0 0;0 0 0 1 0 0 0 1i;0 0 0 0 0 0 0 0;0 0 1 0 0 0 -1i 0]; len = length(layerSymb); % 每层符号数 precodedSymb = zeros(4,len*4); % 存储经过预编码的符号 transSymb=[real(layerSymb(1,:));real(layerSymb(2,:));real(layerSymb(3,:));real(layerSymb(4,:)); imag(layerSymb(1,:));imag(layerSymb(2,:));imag(layerSymb(3,:));imag(layerSymb(4,:))]; transPort = W_TD_4Tx*transSymb; precodedSymb(1,1:4:end-3) = transPort(1,:); precodedSymb(1,2:4:end-2) = transPort(5,:); precodedSymb(1,3:4:end-1) = transPort(9,:); precodedSymb(1,4:4:end-0) = transPort(13,:); precodedSymb(2,1:4:end-3) = transPort(2,:); precodedSymb(2,2:4:end-2) = transPort(6,:); precodedSymb(2,3:4:end-1) = transPort(10,:); precodedSymb(2,4:4:end-0) = transPort(14,:); precodedSymb(3,1:4:end-3) = transPort(3,:); precodedSymb(3,2:4:end-2) = transPort(7,:); precodedSymb(3,3:4:end-1) = transPort(11,:); precodedSymb(3,4:4:end-0) = transPort(15,:); precodedSymb(4,1:4:end-3) = transPort(4,:); precodedSymb(4,2:4:end-2) = transPort(8,:); precodedSymb(4,3:4:end-1) = transPort(12,:); precodedSymb(4,4:4:end-0) = transPort(16,:); % 如果分集方式中,码字上复值符号数不是4的整数倍,则尾部添加的2两个填充要在此处删掉 if mod(M_0_SYMB,4) ~= 0 precodedSymb(:,end-1:end) = []; end end end